Приложение C — Графическая библиотека plotly

Названия графиков рекомендуется добавлять с помощью (Глава 4.1.6).

C.1 Установка

```{r}
install.packages('plotly')
```
Совет

Если график строится успешно, то рекомендуется игнорировать сообщения и предупреждения с помощью message и warning см Глава 4.1.4

```{r}
#| warning: false
#| message: false
```
Важное уведомление

Для отображения графика во всех примерах требуется удалить последнее применение функции |> pshow(). Например Пример C.1

```{r}
#| warning: false
#| message: false

library(plotly)
x <- seq(0, 2*pi, length.out=100)
y <- sin(x)           
plot_ly(x = x, y = y,
        type = 'scatter',
        mode = 'lines') |>
        pshow()
```

Должно стать

```{r}
#| warning: false
#| message: false

library(plotly)
x <- seq(0, 2*pi, length.out=100)
y <- sin(x)           
plot_ly(x = x, y = y,
        type = 'scatter',
        mode = 'lines')
```

C.2 2D График

Пример C.1 (Явные вычисления)  

library(plotly)
1x <- seq(0, 2*pi, length.out=100)
2y <- sin(x)
3plot_ly(x = x, y = y,
4        type = 'scatter',
5        mode = 'lines') |>
  pshow()          
1
Используя функцию seq() создаём вектор x из 100 точек от \(0\) до \(2\pi\).
2
Получаем вектор y применяя функцию sin() к вектору x Глава 6.9
3
Вызываем функцию plotly::plot_ly() определяя и передаем данные явным образом Глава 6.12.5.2
4
Параметр type = 'scatter' определяет тип графика: по точкам.
5
Параметр mode = 'lines' определяет тип отображения непрерывной линией

Пример C.2 (Неявные вычисления через объект формулы) Предыдущий пример можно упростить использовав специфичную для языка r синтаксическую конструкцию объекта формулы Глава 7.10 . Такой подход применяется если зависимость \(y=f(x)\) простая и встречается в коде только один раз.

library(plotly)
1x <- seq(0, 2*pi, length.out=100)
2plot_ly(x = x,
3        y = ~sin(x),
4        type = 'scatter', mode = 'lines') |>
  pshow()                                  
1
Используя функцию seq() создаём вектор x из 100 точек от \(0\) до \(2\pi\)
2
Первый аргумент x передаём явным образом.
3
Вместо явного задания вектора y передаём в аргумент формулу ~sin(x).
4
Определяем параметры отображения

Пример C.3 (Добавить маркеры)  

library(plotly)
1x <- seq(0, 2*pi, length.out=10)
2plot_ly(x = x, y = ~sin(x),
3        type = 'scatter',
4        mode = 'lines + markers') |>
  pshow()
1
Используя функцию seq() создаём вектор x из 10 точек от \(0\) до \(2\pi\)
2
Передаём данные
3
Используя тип графика по точкам
4
Для отображения маркеров используется параметр mode = lines + markers.

Пример C.4 (Объединить графики)  

library(plotly)
1x <- seq(0, 2*pi, length.out=100)
2plot_ly(x = x, y = ~sin(x), type = 'scatter', mode = 'lines',
3        name = 'sin(x)') |>
4  add_trace(x = x, y = ~cos(x), type = 'scatter', mode = 'lines',
5            name = 'cos') |>
  pshow()                                                
1
Используя функцию seq() создаём вектор x из 100 точек от \(0\) до \(2\pi\)
2
Передаём данные как в примерах выше
3
Название перовй линии определяется параметром name = 'sin(x)'. Полученная фигура передаётся в функцию plotly::add_trace() с помощью оператора конвейера Глава A.2.
4
Параметры plotly::add_trace() аналогичны параметрам plot_ly().
5
Название второй линии определяется параметром name = 'cos(x)'.

C.3 3D Поверхность

Один из способ построить 3D график это сгенерировать сетку точек в виде матрицы значений \(z=f(x,y)\).

Пример C.5 (Без масштаба осей) Общий вид графика сохраняется, однако вместо значений по осям x и y будет отложено количество точек, использованное для построения.

1x <- y <- seq(0, pi/2, length.out = 100)
2z <- outer(x, y,
3           \(x,y) { sin(x*y) })  |>
4  t()

5plot_ly(z = z,
6        type = "surface") |>
  pshow() 
1
Используя функцию seq() создаём вектор x из 100 точек от \(0\) до \(\frac{\pi}{2}\).
2
С помощью функции outer Глава A.1 генерируем матрицу Глава 6.5 размером 100x100
3
Для каждой комбинации x,y будет вызвана переданная лямбда функция Глава 7.11 . Матрица передаётся с помощью оператора конвейера Глава A.2 в функцию транспонирования t().
4
Матрица транспонируется t() для соответствия осей матрицы осям графика.
5
Передаём для построения только z.
6
Используется тип графика поверхность.

Пример C.6 (С масштабом осей)  

1x <- y <- seq(0, pi/2, length.out = 100)
2z <- outer(x, y,
3           \(x,y) { sin(x*y) })  |>
4  t()

5plot_ly(z = z, x = x, y = y,
6        type = "surface") |>
  pshow()                                
1
Используя функцию seq() создаём вектор x из 100 точек от \(0\) до \(\frac{\pi}{2}\).
2
С помощью функции outer Глава A.1 генерируем матрицу Глава 6.5 размером 100x100
3
Для каждой комбинации x,y будет вызвана переданная лямбда функция Глава 7.11 . Матрица передаётся с помощью оператора конвейера Глава A.2 в функцию транспонирования t().
4
Матрица транспонируется t() для соответствия осей матрицы осям графика.
5
Передаём данные для построения, кроме z ещё и x с y.
6
Используется тип графика поверхность.

C.4 2D Контурный график

Контурные графики позволяют изображать 3D-данные на 2D-графиках. Каждый контур представляет одно значение z.

Пример C.7 (Без масштаба осей) Общий вид графика сохраняется, однако вместо значений по осям x и y будет отложено количество точек, использованное для построения.

1x <- y <- seq(0, pi/2, length.out = 100)
2z <- outer(x, y,
3           \(x,y) { sin(x*y) })|>
4  t()

5plot_ly(z = z,
6        type='contour') |>
  pshow() 
1
Используя функцию seq() создаём вектор x из 100 точек от \(0\) до \(\frac{\pi}{2}\).
2
С помощью функции outer Глава A.1 генерируем матрицу Глава 6.5 размером 100x100
3
Для каждой комбинации x,y будет вызвана переданная лямбда функция Глава 7.11 . Матрица передаётся с помощью оператора конвейера Глава A.2 в функцию транспонирования t().
4
Матрица транспонируется t() для соответствия осей матрицы осям графика.
5
Передаём данные для построения.
6
Используется тип графика контурный.

Пример C.8 (С масштабом осей)  

1x <- y <- seq(0, pi/2, length.out = 100)
2z <- outer(x, y,
3           \(x,y) { sin(x*y) })|>
4  t()

5plot_ly(x = x, y = y, z = z,
6        type='contour') |>
  pshow()                               
1
Используя функцию seq() создаём вектор x из 100 точек от \(0\) до \(\frac{\pi}{2}\).
2
С помощью функции outer() Глава A.1 генерируем матрицу Глава 6.5 размером 100x100
3
Для каждой комбинации x,y будет вызвана переданная лямда функция Глава 7.11 . Матрица передаётся с помощью оператора конвейера Глава A.2 в функцию транспонирования t().
4
Матрица транспонируется t() для соответствия осей матрицы осям графика.
5
Передаём данные для построения, кроме z ещё и x с y.
6
Используется тип графика контурный.

C.5 3D График плотности срезов

Создаёт контурный график по поверхности среза как функцию \(u=f(x,y,z)\).

library(plotly)

1f <- \(x,y,z) x^2-5*y^2-3*z^2+x*y-2*x*z+2*y*z+11*x+2*y+18*z+10
2x <- y <- z <- seq(-5, 5, length.out = 20)
3d <- tidyr::crossing(x = x, y = y, z = z)
4u <- purrr::pmap_dbl(d,f)

5plot_ly(data = d,
6  type='isosurface',
7  x = ~x, y = ~y, z = ~z,
8  value = u,
9  isomin = -100, isomax = 100,
10  colorscale='RdBu',
11  surface = list(show = TRUE, count = 1),
12  slices = list(z = list(show = TRUE, locations = -5:5),
13                y = list(show = TRUE, locations = 0)),
14  caps = list(x = list(show = FALSE),
15              y = list(show = FALSE))) |>
  pshow_protected()
1
Задаём функцию \(u=f(x,y,z)\) с помощью лямда функции Глава 7.11.
2
Используя функцию seq() создаём вектора x,y,z из \(20\) точек от \(-5\) до \(5\).
3
С помощью функции Глава G.1 генерируем датафрейм Приложение E размером 20x20x20 в котором будут все комбинации значений переменных x, y и z.
4
Применяем функцию f к каждой строке датафрейма d с помощью функции purrr::pmap_dbl() Глава F.1 в результате получаем вектор u, который содержит значения функции для всех точек её области определения.
5
Вызываем функцию построения графика plotly::plot_ly() и передаём туда датафрейм с координатами точек построения.
6
Определяем тип графика контурные поверхности
7
С помощью формул Глава 7.10 показываем от каких переменных из датафрейма зависят оси.
8
Передаём вектор со значениями функции
9
Определяем минимальное и максимальное значение u для отрисовки контурных линий.
10
Выбираем нестандартную цветовую палитру для лучшей визуализации.
11
Добавляем на график одну поверхность соответствующую уравнению \(u=f(x,y,z)=const\)
12
Добавляем 5 срезы по оси z от \(-5\) до \(5\) с шагом \(1\)
13
Добавляем один срез по оси y
14
Отключаем отображение координатной сетки по оси x
15
Отключаем отображение координатной сетки по оси y

C.6 Комбинированные графики

Можно добавлять элементы на график последовательно отображая их.

library(plotly)
x <- y <- seq(0, pi/2, length.out = 100)
z <- outer(x, y, \(x,y) { sin(x*y) })|>t()

fig <- plot_ly(x = x, y = y, z = z, type='contour')
fig |> pshow()

Теперь добавим линию

fig <- fig |> add_trace(x = x,
                        y = ~cos(x),
                        type = 'scatter',
                        mode = 'lines', 
                        name = 'cos')
fig |> pshow_protected()

И выделим точки на этой линии

fig <- fig |> 
  add_trace(x = c(0.4, 0.6, 1),
            y = cos(c(0.4,0.6,1)),
            type = 'scatter',
            mode = 'markers',
            name = 'points',
              marker = list(color = 'red'))
fig |> pshow_protected()

C.7 Дополнительные возможности